package com.zhentao.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zhentao.dto.EffectiveParamQueryDTO;
import com.zhentao.dto.ParamValueDTO;
import com.zhentao.dto.ParamValueQueryDTO;
import com.zhentao.pojo.ParamValue;
import com.zhentao.vo.EffectiveParamVO;
import com.zhentao.vo.ParamValueVO;

import java.util.List;
import java.util.Map;

/**
* @author hp
* @description 针对表【param_value(参数值表：存储参数的实际值，支持多版本和多作用域)】的数据库操作Service
* @createDate 2025-08-28 08:36:25
*/
public interface ParamValueService extends IService<ParamValue> {
    
    /**
     * 获取生效的参数值（核心方法）- 根据作用域优先级和时间范围查询
     * @param queryDTO 查询条件
     * @return 生效的参数值
     */
    EffectiveParamVO getEffectiveParamValue(EffectiveParamQueryDTO queryDTO);
    
    /**
     * 批量获取生效的参数值
     * @param paramKeys 参数键列表
     * @param scopeType 作用域类型
     * @param scopeValue 作用域值
     * @return 参数键值对映射
     */
    Map<String, EffectiveParamVO> getBatchEffectiveParams(List<String> paramKeys, String scopeType, String scopeValue);
    
    /**
     * 分页查询参数值
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<ParamValueVO> queryParamValues(ParamValueQueryDTO queryDTO);
    
    /**
     * 根据ID获取参数值详情
     * @param id 参数值ID
     * @return 参数值详情
     */
    ParamValueVO getParamValueDetail(Long id);
    
    /**
     * 创建参数值
     * @param dto 参数值信息
     * @return 是否创建成功
     */
    boolean createParamValue(ParamValueDTO dto);
    
    /**
     * 更新参数值
     * @param id 参数值ID
     * @param dto 更新信息
     * @return 是否更新成功
     */
    boolean updateParamValue(Long id, ParamValueDTO dto);
    
    /**
     * 删除参数值
     * @param id 参数值ID
     * @return 是否删除成功
     */
    boolean deleteParamValue(Long id);
    
    /**
     * 获取参数值历史记录
     * @param paramId 参数ID
     * @return 历史记录列表
     */
    List<ParamValueVO> getParamValueHistory(Long paramId);
    
    /**
     * 激活/禁用参数值
     * @param id 参数值ID
     * @param isActive 是否激活：1-是，0-否
     * @return 是否操作成功
     */
    boolean toggleParamValueStatus(Long id, Integer isActive);
    
    /**
     * 检查参数值配置是否冲突
     * @param paramId 参数ID
     * @param scopeType 作用域类型
     * @param scopeValue 作用域值
     * @param effectiveTime 生效时间
     * @param expireTime 过期时间
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否存在冲突
     */
    boolean hasConflictParamValue(Long paramId, String scopeType, String scopeValue, 
                                java.util.Date effectiveTime, java.util.Date expireTime, Long excludeId);
}
